home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 4_0 / STRITEMN / STRITEMN.C < prev   
C/C++ Source or Header  |  1989-02-23  |  3KB  |  87 lines

  1. /*******************************************************
  2.  
  3.     stritemn(s,d,n) is a string routine in assembly
  4.         that will extract the Nth item contained
  5.         in the source string (seperated by commas)
  6.         and move it to the destination string.
  7.         
  8. File: stritemn.c
  9.  
  10. History: original by R. Craig Attig, Feb 1989
  11.  
  12. *******************************************************/
  13. #include "stdio.h"
  14. #include "strings.h"
  15.  
  16. void
  17. stritemn()
  18. {
  19.     asm
  20.     {
  21.                 movem.l        4(a7),a0-a1        ;a0 is source, a1 is dest
  22.                 move.w        12(a7),d1        ;d1 is n item
  23.                 subq.w        #1,d1            ;adjust d1 (first item is zeroth, really!)
  24.                 ble.s        @stritemn4        ;if n=0 or less, return with item 1
  25.                 subq.w        #1,d1            ;adjust d1 again for comma count.
  26.                                             ; No, subq.w #2,d1 doesn't work alone!
  27.     stritemn1:
  28.                 cmp.b        #44,(a0)        ;look for seperator...#44=","
  29.                 beq.s        @stritemn2        ;   ...see how many occurances.
  30.                 cmp.b        #0,(a0)            ;look for end of source string...
  31.                 beq.s        @stritemn5        ;   ...and return with no results if end.
  32.                 addq.l        #1,a0            ;next char
  33.                 bra.s        @stritemn1
  34.     stritemn2:
  35.                 addq.l        #1,a0            ;comma found! point to start of item
  36.                 dbne        d1,@stritemn1    ;keep looking if not nth item
  37.     stritemn4:
  38.                 cmp.b        #44,(a0)        ;if last char in item, end it
  39.                 beq.s        @stritemn5
  40.                 cmp.b        #0,(a0)            ;no more chars in item?
  41.                 beq.s        @stritemn5
  42.                 move.b        (a0)+,(a1)+        ;copy char!
  43.                 bra.s        @stritemn4        ;and repeat until over.
  44.     stritemn5:
  45.                 clr.b        (a1)            ;terminate dest string
  46.                 return
  47.     }
  48. }
  49.  
  50. /*******************************************************************/
  51. main()
  52. {
  53.     Str255    s,d;
  54.     int        count;
  55.     
  56.     printf("The string routine Ñstritemn(source,dest,itemNum)Ñ looks at\n");
  57.     printf("the source string, and extracts the item requested in itemNum,\n");
  58.     printf("placing it into the destination string. Items are seperated by\n");
  59.     printf("comma (#44).  Here's an example:\n\n");
  60.     
  61.     strcpy(s,"101,102,103,104,105,106,107,108,109");
  62.     
  63.     printf("Source String: %s\n\n",s);
  64.     
  65.     printf("        (click mouse to continue)          ");
  66.     while (!Button()) ;    /* wait for click due to 1/2 window in MF */
  67.     printf("\n\n");
  68.     
  69.     for(count=0; count<=11; count++)
  70.     {
  71.         stritemn(s,d,count);
  72.         printf("Item number %d: %s\n",count,d);
  73.     }
  74.     
  75.     printf("        (click mouse to continue)          ");
  76.     while (!Button()) ;    /* wait for click due to 1/2 window in MF */
  77.     printf("\n\n");
  78.     
  79.     printf("\nNote that if an item 0 is requested, you'll get the first\n");
  80.     printf("item.  Items requested that exceed the number of items in the\n");
  81.     printf("source string come back empty.");
  82.     
  83.     printf("\n\nPlease click mouse to exit...");
  84.     
  85.     while (!Button()) ;    /* wait for click */
  86. }
  87.